"""
程序名: y = asin(x) + b
作者: fsloper
版本: 0.1.beta
日期: 2024年12月12日
"""
import turtle
import math


# 绘制坐标轴的函数
def draw_axes():
    """
    该函数用于绘制笛卡尔坐标系的x轴和y轴
    """
    axis_pen = turtle.Turtle()
    axis_pen.speed(3)
    axis_pen.pencolor("black")

    # 绘制x轴
    axis_pen.penup()
    axis_pen.goto(-350, 0)
    axis_pen.pendown()
    axis_pen.forward(700)
    axis_pen.write("X", align="right", font=("Arial", 12, "normal"))

    # 绘制y轴
    axis_pen.penup()
    axis_pen.goto(0, -250)
    axis_pen.pendown()
    axis_pen.left(90)
    axis_pen.forward(500)
    axis_pen.write("Y", align="right", font=("Arial", 12, "normal"))


# 根据给定的参数绘制正弦曲线的函数
def draw_sine_curve(a, b, angle_step, direction=1):
    """
    根据传入的参数绘制正弦曲线
    :param a: 影响正弦曲线幅度的参数
    :param b: 影响正弦曲线上下平移的参数
    :param angle_step: 角度的步长，用于控制绘制的精度
    :param direction: 绘制方向，1表示正方向（正半轴），-1表示负方向（负半轴）
    """
    curve_pen = turtle.Turtle()
    curve_pen.speed(3)
    curve_pen.pencolor("blue")  # 可以根据需求修改曲线颜色

    curve_pen.penup()
    # 起始点坐标计算并移动到起始位置
    start_y = int(math.sin(2 * math.pi / angle_step * direction) * a * 4) + b
    curve_pen.goto(0, start_y)
    curve_pen.pendown()

    # 将角度范围转换为弧度，根据给定的步长绘制曲线
    for angle_radian in range(0, int(2 * math.pi / angle_step) * direction, direction):
        angle_radian = angle_radian * angle_step
        y = (math.sin(angle_radian) * a * 4) + b
        x = angle_radian * 100
        curve_pen.goto(x, y)


# 获取用户输入的a和b值
a = int(input("请输入整数a的值: "))
b = int(input("请输入整数b的值: "))

# 设置画布大小
turtle.setup(800, 600)

# 绘制坐标轴
draw_axes()

# 定义角度步长，用于控制正弦曲线绘制的精度
angle_step = 0.1

# 绘制正半轴正弦曲线
draw_sine_curve(a, b, angle_step, 1)

# 绘制负半轴正弦曲线
draw_sine_curve(a, b, angle_step, -1)

turtle.done()
